home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Franz PD / Franz PD Disk #054 (1990)(Amiga User Group Deutschland e.V.).zip / Franz PD Disk #054 (1990)(Amiga User Group Deutschland e.V.).adf / SaveKick / SaveKick.s < prev    next >
Text File  |  1989-07-02  |  10KB  |  451 lines

  1. *************************************************************
  2. ;                                                           *
  3. ; This is Public Domain !!! Do with it what you like !!!!!!!!
  4. ;                                                           *
  5. *************************************************************
  6. ; SaveKick.s  speichert den Kickstart Speicher ab $F80000
  7. ;             auf Disk DF0:
  8. ;                      ~~~~
  9. ;             ==> Kickstart Disk fuer A1000
  10. ;
  11. ;             Autor :
  12. ;                          Sascha Groening
  13. ;                          Blaustr.:    13
  14. ;                          8360 Deggendorf
  15. ;                          West-Germany
  16. ;
  17. ;
  18. ;
  19. ; ACHTUNG :   alle Daten auf der Disk werden ueberschrieben
  20. ;
  21. ;             benoetigt $40000+$200 ( =262656) Byte freies Chip-Memory
  22. ;                                                          ----
  23. ;             ==> Prg am besten auf zukuenftiger Kickstartdisk
  24. ;                 Bootfaehig installieren
  25. ;
  26. ;                 ==> install df0:
  27. ;                     copy SaveKick df0:
  28. ;                     s:startup-sequence = "SaveKick"
  29. ;
  30. ; Programm wurde fuer den   A68K  Public Domain Assembler
  31. ;                           BLINK Public Domain Linker       geschrieben
  32. ;
  33. ;       (A68K :Fish Disk Nr.:110 )
  34. ;       (BLINK:Fish Disk Nr.: 40 )
  35. ;
  36. ;
  37. ; Assemblieren :     A68K SaveKick.s
  38. ;                    BLINK SaveKick.o
  39. ;
  40. ;
  41. ; Nutzen :
  42. ;
  43. ; SaveKick erzeugt Kickstart Disk fuer Amiga 1000 indem es den Kickstart
  44. ;          Speicher auf Disk schreibt und in den Bootblock die
  45. ;          Kennung 'KICK' eintraegt.
  46. ;
  47. ;          ==> A1000 Besitzer koennen sich von jedem A500 mit Kickstart Rom
  48. ;              eine Kickstart Disk erzeugen lassen .
  49. ;
  50. ;          ACHTUNG: Copyright Bestimmungen beachten !!!!!
  51. ;
  52.  
  53.  
  54.  
  55. SysBase   equ 4
  56. AllocMem equ -198
  57. FreeMem equ -210
  58. FindTask equ -294
  59. AllocSignal equ -330
  60. FreeSignal equ -336
  61. AddPort equ -354
  62. RemPort equ -360
  63. OldOpenLibrary equ -408
  64. CloseLibrary equ -414
  65. OpenDevice equ -444
  66. CloseDevice equ -450
  67. DoIO equ -456
  68.  
  69.  
  70. Open equ -30
  71. Close equ -36
  72. Read equ -42
  73. Write equ -48
  74. Input equ -54
  75. Output equ -60
  76.  
  77.  
  78. MODE_READWRITE equ 1004
  79. MODE_OLDFILE   equ 1005
  80. MODE_NEWFILE   equ 1006
  81. MODE_READONLY  equ MODE_OLDFILE
  82.  
  83. MEMF_PUBLIC  equ $1
  84. MEMF_CHIP    equ $2
  85. MEMF_FAST    equ $4
  86. MEMF_CLEAR   equ $10000
  87. MEMF_LARGEST equ $20000
  88.  
  89.  
  90. CALLEXEC macro
  91.          movea.l SysBase,a6
  92.          jsr    \1(a6)
  93.          endm
  94.  
  95. CALLDOS  macro
  96.          movea.l DOSBase,a6
  97.          jsr    \1(a6)
  98.          endm
  99.  
  100. buffersize   equ $00000200
  101.  
  102. ;
  103. ; *********** MainProg **********
  104.  
  105.  
  106. _main
  107.     move.l a7,stapel
  108.  
  109.     lea.l dosname,a1
  110.     CALLEXEC OldOpenLibrary        ;Open DOSLibrary
  111.     move.l d0,DOSBase
  112.     beq    fini
  113.  
  114.     CALLDOS Output         ;LVOOutput
  115.     move.l d0,OutHandle
  116.  
  117.     CALLDOS Input
  118.     move.l d0,InHandle
  119.  
  120.     move.l OutHandle,d1
  121.     move.l #Message1,d2
  122.     move.l #len4,d3
  123.     CALLDOS Write
  124.  
  125.     move.l InHandle,d1
  126.     move.l #Message1,d2  ;Warte auf Taste
  127.     moveq.l #1,d3
  128.     CALLDOS Read
  129.  
  130.  
  131. ;    movem.l d0-d2/a0-a1,-(a7)
  132. ;    move.l #_main,d2
  133. ;    lea.l  hbuf,a0
  134. ;    move.b #10,8(a0)
  135. ;    bsr    hexasc
  136. ;    move.l OutHandle,d1
  137. ;    move.l #hbuf,d2
  138. ;    moveq.l #9,d3
  139. ;    CALLDOS Write
  140. ;    movem.l (a7)+,d0-d2/a0-a1
  141.  
  142. ;
  143. ;  SIGNAL besetzen
  144. ;
  145.     moveq.l #-1,d0
  146.     CALLEXEC AllocSignal        ;AllocSignal
  147.     move.b d0,SIGNAL
  148.     bmi    SignalFehler    ;D0=-1 =>Fehler
  149. ;
  150. ;   Msg-Port Struktur initialisieren
  151. ;
  152.     move.b d0,mp_SigBit
  153.     suba.l  a1,a1
  154.     CALLEXEC FindTask         ;Find own Task
  155.     move.l d0,mp_SigTask
  156.     lea.l  MsgPort,a1
  157.     CALLEXEC AddPort          ;AddPort
  158. ;
  159. ;**** Speicher allokieren ***
  160. ;
  161.     move.l #buffersize,d0             ;groesse des Speichers
  162.     move.l #MEMF_CHIP!MEMF_CLEAR,d1   ;allokierten Speicher mit $00 fuellen
  163.     CALLEXEC AllocMem
  164.  
  165.     move.l d0,DATA   ; Buffer fuer Bootblock
  166.     beq    nomem
  167.  
  168.     move.l #$40000,d0     ;groesse des KickstartROM/RAMs
  169.     move.l #MEMF_CHIP!MEMF_CLEAR,d1      ;allokierten Speicher mit $00 fuellen
  170.     CALLEXEC AllocMem
  171.  
  172.     move.l d0,kickbuffer   ; Buffer fuer Bootblock
  173.     beq    nomem
  174.  
  175.  
  176. ;
  177. ; TrackDiskDevice oeffnen
  178. ;
  179.  
  180.     lea.l  TD_Name,a0
  181.     lea.l  IOExtReq,a1
  182.     clr.l  d0
  183.     clr.l  d1
  184.     CALLEXEC OpenDevice         ;OpenDevice
  185.     tst.l  d0
  186.     bne    LeseFehler
  187.  
  188.     lea.l MsgPort,a1
  189.     move.l a1,mn_ReplyPort2
  190.  
  191. ***** MAIN
  192.  
  193.  
  194.  
  195.     bsr   installBB   ;installiere Block 0 mit 'KICK'-string
  196.     bsr   copykick    ;kopiere Kickstart Speicher ins CHIP Memory
  197.     bsr   savekick    ;kopiere diesen Speicher auf Disk
  198.                       ;(direkt geht's nicht ,da das trackdisk.device nur
  199.                       ; auf das CHIP-Memory zugreifen kann !!)
  200.  
  201.     bsr   motoroff    ;Motor abstellen
  202.  
  203.  
  204.  
  205.  
  206.  
  207. CloseAll
  208. closedev
  209.     movea.l stapel,a7
  210.     lea.l  IOExtReq,a1
  211.     CALLEXEC  CloseDevice        ;CloseDevice
  212.  
  213. memfree1
  214.     tst.l   kickbuffer
  215.     beq     memfree2
  216.     movea.l kickbuffer,a1  ;Speicher wieder freigeben
  217.     move.l  #$40000,d0
  218.     CALLEXEC  FreeMem
  219.  
  220. memfree2
  221.     movea.l stapel,a7
  222.     movea.l DATA,a1
  223.     move.l  #buffersize,d0
  224.     CALLEXEC  FreeMem
  225.  
  226. ClosePort
  227.     movea.l stapel,a7
  228.     lea.l  MsgPort,a1
  229.     CALLEXEC RemPort        ;RemPort
  230.  
  231. FreeSig
  232.     movea.l stapel,a7
  233.     clr.l   d0
  234.     move.b  SIGNAL,d0
  235.     CALLEXEC FreeSignal        ;FreeSignal
  236.  
  237. closedos
  238.     movea.l DOSBase,a1
  239.     CALLEXEC CloseLibrary        ;CloseLibrary
  240.     clr.l  d0
  241. fini rts
  242.  
  243.  
  244.  
  245. ************************
  246. ***** SubProgs
  247. ************************
  248.  
  249.  
  250.  
  251. installBB
  252.     movea.l DATA,A0
  253.     move.l #$4B49434B,(A0)+
  254.  
  255. installBB2
  256.     move.l DATA,IO_DATA2    ;DATA
  257.     move.l #0,IO_OFFSET2
  258.     move.l #$00000200,IO_LENGTH2
  259.     move.w #3,IO_COMMAND2        ;IO_COMMAND2 = FORMATIEREN
  260.     bra    SchreibeBlock
  261.  
  262.  
  263. SchreibeBlock
  264.     lea.l  IOExtReq,a1
  265.     CALLEXEC DoIO           ;Kommando ausfuehren
  266.     move.b IO_ERROR2,d0
  267.     bne    LeseFehler
  268.     lea.l  IOExtReq,a1
  269.     move.w #4,IO_COMMAND2
  270.     CALLEXEC DoIO
  271.     rts
  272.  
  273. copykick
  274.     move.l #$FFFF,d1    ;(Laenge des Kickstart Speichers in LWords)-1
  275.     move.l #$F80000,a0  ;Anfang des Kickstart Speichers
  276.     move.l kickbuffer,a1 ;Kopierziel
  277.  
  278. loop3
  279.     move.l (a0)+,(a1)+
  280.     dbra   d1,loop3
  281.  
  282.     rts
  283.  
  284. ;
  285. ; Speichert $40000 Bytes von kickbuffer nach Block 1 bis x
  286. ;
  287.  
  288. savekick
  289.     move.l kickbuffer,IO_DATA2
  290.     move.l #512,IO_OFFSET2      ;Block 1
  291.     move.l #$40000,IO_LENGTH2
  292.     move.w #3,IO_COMMAND2        ;IO_COMMAND2 = CMD_WRITE
  293.     bra    SchreibeBlock
  294.  
  295. ;
  296. ; Schaltet den Motor ab
  297. ;
  298.  
  299. motoroff
  300.     move.w #$0009,IO_COMMAND2  ;Motorstatus aendern
  301.     move.l #$0000,IO_LENGTH2   ;0==> Motor abschalten
  302.  
  303.     lea.l  IOExtReq,a1
  304.     CALLEXEC DoIO           ;Kommando ausfuehren
  305.     rts
  306.  
  307.  
  308. ;
  309. ; Konvertiere d2.l in ASCII-String ab (a0)
  310. ;
  311.  
  312. hexasc
  313.     moveq   #7,d0                       ;8 Nibble (=Halbbyte) wandeln
  314.     adda.l  #8,a0                       ;Pos der letzten Stelle im Buffer+1
  315. loop5
  316.     moveq   #15,d1                      ;
  317.     and.l   d2,d1                       ;1 Nibble isolieren
  318.     asr.l   #4,d2                       ;naechstes Nibble an 1.Pos
  319.     addi.b  #48,d1                      ;isol. Nibble+48=Zahl in ASCII
  320.     cmp.b   #57,d1                      ;war Zahl >9 ?
  321.     bls     cont4
  322.     addq.l  #7,d1                       ;wenn ja noch 7 dazu ==> A-F
  323. cont4
  324.     move.b  d1,-(a0)                    ;in Buffer eintragen
  325.     dbra    d0,loop5                    ;naechstes Nibble wandeln
  326.     rts
  327.  
  328.  
  329.  
  330.  
  331.  
  332. SignalFehler
  333.     move.l OutHandle,d1
  334.     move.l #Fehler1,d2
  335.     moveq.l #len1,d3
  336.     CALLDOS Write     ;LVOWrite
  337.     bra    closedos
  338.  
  339. LeseFehler
  340.     move.l d0,d2
  341.     lea.l  hbuf,a0
  342.     move.b #10,8(a0)               ;LineFeed anfuegen
  343.     bsr    hexasc
  344.     move.l OutHandle,d1
  345.     move.l #Fehler2,d2     ;FehlerMeldung ausgeben
  346.     moveq.l #len2,d3
  347.     CALLDOS Write
  348.  
  349.     move.l OutHandle,d1
  350.     move.l #hbuf,d2
  351.     moveq.l #9,d3
  352.     CALLDOS Write          ;Fehlercode ausgeben
  353.  
  354.     bsr   motoroff
  355.     bra   CloseAll
  356.  
  357.  
  358. nomem
  359.     move.l OutHandle,d1
  360.     move.l #Fehler3,d2
  361.     moveq.l #len3,d3
  362.     CALLDOS Write     ;LVOWrite
  363.     bra    memfree1
  364.  
  365.  
  366. ***************************************
  367. ***************************************
  368.  
  369.  DATA constants
  370.  
  371.             cnop 0,2
  372. Name        dc.b 'SaveKickPort',0    ;Name des Msg-Ports
  373.             cnop 0,2
  374. MsgPort
  375. ln_Succ     dc.l 0  ;Message-Port Struktur
  376.             cnop 0,2
  377. ln_Pred     dc.l 0
  378. ln_Type     dc.b 4
  379. ln_Pri      dc.b 0
  380. ln_Name     dc.l Name
  381. mp_Flags    dc.b 0
  382. mp_SigBit   dc.b 0
  383. mp_SigTask  dc.l 0
  384. lh_Head     dc.l 0
  385. lh_Tail     dc.l 0
  386. lh_TailPred dc.l 0
  387. lh_Type     dc.b 0
  388.             dc.b 0  ;gerade Adr schaffen
  389.             cnop 0,2
  390. IOExtReq
  391. ln_Succ2    dc.l 0
  392.             cnop 0,2
  393. ln_Pred2    dc.l 0
  394. ln_Type2    dc.b 5
  395. ln_Pri2     dc.b 0
  396. ln_Name2    dc.l Name2
  397. mn_ReplyPort2   dc.l 0
  398. mn_Length2  dc.w $0038
  399. IO_DEVICE2  dc.l 0
  400. IO_UNIT2    dc.l 0
  401. IO_COMMAND2 dc.w 0
  402. IO_FLAGS2   dc.b 0
  403. IO_ERROR2   dc.b 0
  404. IO_ACTUAL2  dc.l 0
  405. IO_LENGTH2  dc.l $0200
  406. IO_DATA2    dc.l 0
  407. IO_OFFSET2  dc.l 0
  408. IOTD_COUNT  dc.l 0
  409. IOTD_SECLABEL dc.l 0
  410.  
  411. Name2       dc.b 'SaveKickMsg',0,0
  412.             cnop 0,2
  413. Fehler1     dc.b 'SigBitFehler',10       ;der Stern (*) ist der Location
  414. len1        equ  *-Fehler1            ;Counter des Assembler (LC)
  415.             cnop 0,2                  ;er enthaelt im Gegensatz zum
  416. Fehler2     dc.b 'Read/Write error:'        ;Program Counter (PC) der CPU
  417. len2        equ  *-Fehler2            ;die relative Adr (relativ zum
  418.             cnop 0,2                  ;Programmanfang) der aktuellen
  419. Fehler3     dc.b 'not enough Memory  !',10  ;Zeile !!!
  420. len3        equ  *-Fehler3
  421.             cnop 0,2
  422. Message1    dc.b 'SaveKick   by Sascha Groening',10
  423.             dc.b 'This is Public Domain ! Do with it what you like !',10
  424.             dc.b 'Please insert disk in DF0: to copy Kickstart-Memory on',10
  425.             dc.b 'ATTENTION : this will erase all DATA on this Disk !!',10
  426.             dc.b '            $40200 (=262656) Byte FREE Chip-Memory is needed !',10
  427.             dc.b 'Press any key ...'
  428. len4        equ  *-Message1
  429.             cnop 0,2
  430. dosname     dc.b 'dos.library',0
  431.             cnop 0,2
  432. TD_Name     dc.b 'trackdisk.device',0
  433.             cnop 0,2
  434.  
  435.  BSS storage
  436.  
  437. SIGNAL      ds.l 1
  438. DATA        ds.l 1
  439. kickbuffer  ds.l 1
  440. stapel      ds.l 1
  441. DOSBase     ds.l 1
  442. OutHandle   ds.l 1
  443. InHandle    ds.l 1
  444. hbuf        ds.l 3
  445.  
  446.  
  447.             END
  448.  
  449.  
  450.  
  451.